package com.cskaoyan.javase.oop2.initialization6.implicit2;

/**
 * @description: 子类对象的隐式初始化
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 子类对象的隐式初始化：
 * 首先有条件的：
 * 1，父类中有默认的构造方法
 * 2，子类的构造器中没有显式调用父类的构造方法
 *
 *
 * 马上回答一个问题：为什么我之前说大家一定要手动提供默认无参构造呢？
 * 我们经常会使用继承，那么继承中如果是隐式的子类初始化，必然会调用父类的默认无参构造，如果你没写，就报错
 * 所以我们要养成好习惯，随手写类的默认无参
 * 我可以通过这个默认无参
 *
 * 隐式初始化总是不传参数，如果我们想要对父类中参数进行赋值，就必须使用显式的子类初始化
 * 明确调用父类中的有参构造方法
 *
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        Cat cat = new Cat(); //这个创建子类对象 就是隐式初始化
    }
}

class Animal{
    String name;
    public Animal(String name) {
        this.name = name;
    }

    public Animal() {
        //隐含了一个默认的无参构造
        //super() 所以这里调用的是Object类的默认无参构造
        //于是你立刻推出：Object类当中一定有无参构造
    }
}

class Cat extends  Animal{
    //There is no default constructor available in 'com.cskaoyan.javase.oop2.initialization6.implicit2.Animal'
    //这里不满足条件1，于是不构成隐式初始化，所以不能保证父类成员一定先加载
    //于是编译报错
    public Cat() {
        //隐含了一个super() 并且是在第一行
    }
}
